package org.dicr.util.jds.gui;

import java.awt.*;

import javax.swing.*;

import org.dicr.event.*;
import org.dicr.gui.*;

import com.borland.dx.dataset.*;

/***********************************************************************************************************************
 * @author Igor A Tarasov me@dicr.dn.ua
 * @version 030127
 **********************************************************************************************************************/
public abstract class DataPanel extends JPanel implements DataSetAware, ProgramEventGenerator, Editable, AccessListener, NavigationListener, DataChangeListener {
	/**
     * 
     */
	private static final long serialVersionUID = 1310156917338420454L;

	/** слушатели программных событий */
	protected ProgramEventMulticaster eventMulticaster = new ProgramEventMulticaster();

	/** источник данных */
	protected DataSet dataset = null;

	/** заголовок таблицы */
	protected TitleLabel titleLabel = new TitleLabel();

	/** свойство редактируемости */
	protected boolean editable = true;

	/** панель управления */
	protected DataControlPanel controlPanel = new DataControlPanel();

	/*******************************************************************************************************************
	 * Конструктор
	 ******************************************************************************************************************/
	public DataPanel() {
		try {
			jbInit();
		} catch (Exception ex) {
			DicrExceptionHandler.handleException(ex, this);
		}
	}

	/*******************************************************************************************************************
	 * Инициализация
	 ******************************************************************************************************************/
	private void jbInit() {
		this.setLayout(new BorderLayout());
		this.add(this.titleLabel, BorderLayout.NORTH);
		this.add(this.controlPanel, BorderLayout.SOUTH);
		this.controlPanel.setControlButtonsMask(0);
	}

	/*******************************************************************************************************************
	 * Возвращает панель управления
	 ******************************************************************************************************************/
	public DataControlPanel getControlPanel() {
		return this.controlPanel;
	}

	/*******************************************************************************************************************
	 * Возвращает заголовок панели
	 ******************************************************************************************************************/
	public TitleLabel getTitleLabel() {
		return this.titleLabel;
	}

	/*******************************************************************************************************************
	 * Устанавливает свойство редактируемости
	 ******************************************************************************************************************/
	@Override
    public void setEditable(boolean the_editable) {
		this.editable = the_editable;
	}

	/*******************************************************************************************************************
	 * Возвращает свойство редактируемости
	 ******************************************************************************************************************/
	@Override
    public boolean isEditable() {
		return this.editable;
	}

	/*******************************************************************************************************************
	 * Устанавливает источник данных
	 ******************************************************************************************************************/
	@Override
    public void setDataSet(DataSet dataSet) throws DataSetException {
		if (this.dataset != dataSet) {
			if (this.dataset != null) {
				this.dataset.removeAccessListener(this);
				this.dataset.removeNavigationListener(this);
				this.dataset.removeDataChangeListener(this);
			}
			this.dataset = dataSet;
			this.controlPanel.setDataSet(this.dataset);
			if (this.dataset != null) {
				this.dataset.addAccessListener(this);
				this.dataset.addNavigationListener(this);
				this.dataset.addDataChangeListener(this);
				if (!this.dataset.isOpen()) this.dataset.open();
			}
		}
	}

	/*******************************************************************************************************************
	 * Возвращает источник данных
	 ******************************************************************************************************************/
	@Override
    public DataSet getDataSet() {
		return this.dataset;
	}

	/*******************************************************************************************************************
	 * Проверка состояния источника данных
	 ******************************************************************************************************************/
	protected boolean isValidDataSetState() {
		return (this.dataset != null && this.dataset.isOpen());
	}

	/*******************************************************************************************************************
	 * Добавляет слушателя программных событий
	 ******************************************************************************************************************/
	@Override
    public void addProgramListener(ProgramListener l) {
		this.eventMulticaster.addProgramListener(l);
	}

	/*******************************************************************************************************************
	 * Удаляет слушателя программных событий
	 ******************************************************************************************************************/
	@Override
    public void removeProgramListener(ProgramListener l) {
		this.eventMulticaster.removeProgramListener(l);
	}

	/*******************************************************************************************************************
	 * Обработчик событий доступа к DataSet
	 ******************************************************************************************************************/
	@Override
    public void accessChange(AccessEvent event) {
	// NOP
	}

	/*******************************************************************************************************************
	 * Обработчик событий навигации DataSet
	 ******************************************************************************************************************/
	@Override
    public void navigated(NavigationEvent event) {
	// NOP
	}

	/*******************************************************************************************************************
	 * Обработка изменения данных
	 ******************************************************************************************************************/
	@Override
    public void dataChanged(DataChangeEvent event) {
	// NOP
	}

	/*******************************************************************************************************************
	 * Обработка посылки строки данных
	 ******************************************************************************************************************/
	@Override
    public void postRow(DataChangeEvent event) throws Exception {
	// NOP
	}
}
